package com.example.learnjava.exception;

/**
 * 自定义异常
 * 115_面向对象(自定义异常)_黑马程序员_Java基础视频
 *
 * 因为项目中会出现特有的问题，
 * 而这些问题并未被java所描述并封装对象
 * 所以对于这些特有的问题可以按照java的对问题封装的思路，将特有的问题，进行自定义异常封装
 *
 * 自定义异常
 *
 * 需求：在本程序中，对于除数是负数，也视为是错误的是无法进行运算的，那么就需要对这个问题进行自定义的描述。
 *
 * 当在函数内部出现了throw抛出异常对象，那么就必须要给对应的吹对象
 * 要么在内部try catch处理
 * 要么在函数上声明让调用者处理。
 *
 * 一般情况下，函数内出现异常杨，函数上需要声明。
 *
 * 发现打印的结果中只有异常的名称，却没有异常信息
 * 因为自定义的异常并未定义信息。
 *
 * 如何定义异常信息呢？
 * 因为父类中已经把异常信息的操作都完成了，
 * 所以子类只要在构造时，将异常信息传递给父类通过super语句，
 * 那么就可以直接通过getMessage方法获取自定义的异常信息。
 *
 * 自定义异常：
 * 必须是自定义类继承Exception。
 *
 * 继承Exception原因：
 * 异常体系有一个特点，因为异常类和异常对象都被抛出。
 * 它们都具备可抛性，这个可抛性是Throwable这个体系中独有特点。
 * 只有这个体系中的类和对象才可以被throws和throw操作。
 *
 * throws和throw的区别
 * throws使用在函数上
 * throw使用在函数内
 *
 * throws后面跟的是异常类，可以跟多个，用逗号隔开
 * throw后面跟的是异常对象。
 */

class FushuException extends Exception{
    private int value;

    public FushuException(String message,int value) {
        super(message);
        this.value=value;
    }

    public int getValue(){
        return value;
    }

    //    private String msg;
//
//    public FushuException(String msg) {
//        this.msg = msg;
//    }
//
//    @Nullable
//    @Override
//    public String getMessage() {
//        return msg;
//    }
}
class Demo2 {
    int div(int a, int b) throws FushuException{
        if (b<0)
            throw new FushuException("出现除数为负数了",b);//手动通过throw关键字抛出一个自定义的异常对象。

        return a / b;
    }
}


public class b_CustomException_115_116 {
    public static void main(String[] args) {
        Demo2 demo2=new Demo2();
        try {
            int x = demo2.div(4, 0);
            System.out.println("x="+x);
        } catch (FushuException e) {
            throw new RuntimeException(e);
        }
    }
}
